<?php  
require_once("Const.php");
include "namespace.php";
require_once("namespace1.php");
// include "namespace1.php";

// PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问，也可以直接用来更新全局变量


// echo 和 print 区别:
// echo - 可以输出一个或多个字符串
// print - 只允许输出一个字符串，返回值总为 1
// 提示：echo 输出的速度比 print 快， echo 没有返回值，print有返回值1
$txt1 = "--->jie";
echo "string","dadas","dad**$txt1","<br>";
echo $GLOBALS["23"];
// var_dump($_SERVER);
// $globalVar = 10;


//Trait是在PHP5.4中加入的，它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。
// Trait 会覆盖调用类继承的父类方法
// Trait 无法如 Class 一样使用 new 实例化
// 单个 Trait 可由多个 Trait 组成
// 在单个 Class 中，可以使用多个 Trait
// Trait 支持修饰词（modifiers），例如 final、static、abstract
// 我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突
//trait可以定义成员变量
trait first_trait {
  var $traitProperty;
  function traitFUnction (){

     echo "<br>我是第一个trait方法<br>";
  }
   
}


trait second_trait {

  function traitFunction (){

    echo "<br>我是第二个trait方法<br>";
  }

}
class Car
{
  //在类中通过use引入trait 用insteadof解决冲突
  use first_trait, second_trait {

    second_trait::traitFunction insteadof first_trait;
  }
  var $color;
  //php参数可以设置默认值,和swift一样
  function __construct($color="green") {
    echo "<br>类名=>",__CLASS__,"<br>";
    $this->color = $color;
    $this->traitProperty = '我是traitProperty';
  }
  function what_color() {
    return $this->color;
  }
  //this就是指向当前对象实例的指针，不指向任何其他对象或类.注意$符号写在this前面
}  
$car1 = new Car();

$car1->traitFunction();

echo "<br>trait属性=>",$car1->traitProperty,"<br>";

// echo "$car1_colro";
// NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。
// NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。
// 可以通过设置变量值为 NULL 来清空变量数据

$arr1 = Array("name","year","address"=>"北京","date");
echo $arr1[0];
$arr2 = Array("name"=>"luojie","year"=>24);
//获取数组的长度 - count() 函数
echo "<br>","year:",$arr2["year"],"    ","count:",count($arr2),"<br>";
foreach ($arr2 as $key => $value) {
	echo $key,"=>",$value,"<br>";
}
foreach ($arr1 as $key => $value) {
	echo $key,"=>",$value,"<br>";
}

$name = "罗杰";
function changeName ($newName) {

   $newName = "刘才文";

}
changeName($name);
echo "<br>",$name;

echo "oldColor=>",$car1->color,"<br>";
function changeColor ($car) {
echo "函数名=>",__FUNCTION__,"<br>";
echo "方法名=>",__METHOD__,"<br>";//两者不同尚不知 

  $car -> color = "blue";

}
changeColor($car1);
echo "newColor=>",$car1->color,"<br>";


//PHP 魔术变量 =>PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的，只有在加载了这些扩展库时才会出现，或者动态加载后，或者在编译时已经包括进去了。
//魔术变亮一般前后都有双下划线
echo "这是",__LINE__,"行<br>";//此处所处的位置


echo "文件所在=>",__FILE__,"<br>";//完整的绝对路径，和_SERVETR["PHP_SELF"]略有不同，_SERVETR["PHP_SELF"]是在服务器所在位置，__FILE__是在计算机所在位置

echo "文件所在目录=>",__DIR__,"<br>";//文件所在目录

//__CLASS__类名    __FUNCTION__函数名称


echo "命名空间=>",__NAMESPACE__,"<br>";



/**
* 
*/
class Clean 
{
   function remove () {

    echo __CLASS__,"  ",__FUNCTION__,"<br>";

   }
    

}
$c = new Clean();
$c -> remove();

//通过反斜杠加命名空间，来调用命名空间相关代码
$c1 =  new MynameSpace\Clean();
$c1 -> remove();


$c2 = new MynameSpace1\Clean();
$c2 -> remove();


$c3 = new MynameSpace2\CleanClass\Clean();
$c3 -> remove();
  
//全局非命名空间的代码可以直接调用，不需要带命名空间名（因为没有名字）
$c4 = new GloadleClass ();
$c4 -> destributeSelf();

$cName = "Clean";
$c5 = new $cName;
$c5 -> remove();

$gName = "MynameSpace2\CleanClass\Clean";
$c6 = new $gName;
$c6 -> remove();
MynameSpace2\CleanClass\funcname();
echo MynameSpace2\CleanClass\constantVar,"<br>";
echo constant("MynameSpace2\CleanClass\constantVar");

echo "<br>";
//方法调用时，用双反斜杠分开方法;
$fName = "MynameSpace2\CleanClass\\funcname";
$fName();

$sCName = "MynameSpace2\CleanClass\\getFuncName";
var_dump($sCName);
echo $sCName("car");

// "note=>php都要以分号结尾"
echo '<p>根据动态语言的特性，可以直接用字符串变量声明一个类 $cName = "Clean"; $c5 = new $cName;创建一个Clean实例，类似oc,同理方法，变量也可以这样表示，通过字符串获得方法，类，变量</p>';

// use Car as AliasCar;
// $aliasC = AliasCar();
// echo $aliasC -> what_color();

// $c8 = new MynameSpace2\CleanClass\AliasClean();
// $c8 -> remove();



?>
